上文描述的核内同步,自动同步编译选项能够正确插入同步强依赖于LocalTensor间依赖关系,特别做如下说明。
临时LocalTensor直接逻辑依赖(赋值、引用、指针操作)支持自动同步。非直接逻辑依赖(利用容器传递,手动tensor成员赋值,函数传值等)不支持自动同步,需要开发者手动改为支持场景。
下面以vector间PIPE_V的插入举例,其中Vector_OP指任意的vector指令:
直接逻辑依赖场景 LocalTensor初始化通过赋值方式// 定义dstLocal1LocalTensor dstLocal1;Vector_OP(dstLocal1, params); // 赋值定义dstLocal2LocalTensor dstLocal2 = dstLocal1; // 自动插入PIPE_VVector_OP(dstLocal2, params);LocalTensor初始化通过切片赋值方式// 定义dstLocal1LocalTensor dstLocal1;Vector_OP(dstLocal1, params); // 切片赋值定义dstLocal2LocalTensor dstLocal2 = dstLocal1[512]; // 自动插入PIPE_VVector_OP(dstLocal2, params); LocalTensor初始化通过引用方式// 定义dstLocal1LocalTensor dstLocal1;Vector_OP(dstLocal1, params); // 引用定义dstLocal2LocalTensor &dstLocal2 = dstLocal1; // 自动插入PIPE_VVector_OP(dstLocal2, params); LocalTensor初始化通过指针方式// 定义dstLocal1LocalTensor dstLocal1;Vector_OP(dstLocal1, params); // 指针定义dstLocal2LocalTensor *dstLocal2 = &dstLocal1; // 自动插入PIPE_VVector_OP(*dstLocal2, params); 非直接逻辑依赖场景 LocalTensor初始化通过容器Que方式// 定义dstLocal1LocalTensor dstLocal1;Vector_OP(dstLocal1, params);inQueueSrc.EnQue(dstLocal1); // 容器Que定义dstLocal2LocalTensor dstLocal2 = inQueueSrc.DeQue(); // 无法获取依赖,需手动改为支持场景Vector_OP(dstLocal2, params);LocalTensor初始化通过其内存成员的接口方式// 定义dstLocal1LocalTensor dstLocal1;Vector_OP(dstLocal1, params);// LocalTensor操作内存成员接口定义dstLocal2内存地址dstLocal2.SetAddrWithOffset(dstLocal1, offset);// 无法获取依赖,需手动改为支持场景Vector_OP(dstLocal2, params);函数接口场景:LocalTensor dstLocal1;Vector_OP(dstLocal1, params);__aicore__ void Foo (dstLocal1) { // 无法获取依赖,需手动改为支持场景Vector_OP(dstLocal1, params);}